package com.artisan.toolcalling.controller;

import com.artisan.toolcalling.service.DateTimeTools;
import com.artisan.toolcalling.service.ToolService;
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.chat.model.ChatModel;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class ToolsController {

    private final ChatClient chatClient;
    private final ChatClient dateTimeChatClient;


    public ToolsController(ChatClient.Builder chatClientBuilder,
                           ToolService toolService,
                           DateTimeTools dateTimeTools,
                           ChatModel chatModel) {
        // 原有的航空客服工具
        this.chatClient = chatClientBuilder
                .defaultSystem("""
                        # 角色
                        你是智能航空客服助手
                        ## 要求
                        严禁随意补全或猜测工具调用参数。 参数如缺失或语义不准，请不要补充或随意传递，请直接放弃本次工具调用。"
                        """)
                .defaultTools(toolService)  // 底层就会告诉大模型提供了什么工具， 需要什么参数
                // 动态tool设置
                //.defaultToolCallbacks(toolService.getToolCallList(toolService))
                .build();

        // 新增的日期时间工具客户端
        this.dateTimeChatClient = chatClientBuilder
                .defaultSystem("""
                        # 角色
                        你是一个智能时间助手，可以帮助用户获取时间信息、设置闹钟、计算时间差等。
                        ## 要求
                        1. 当用户询问时间相关问题时，优先使用提供的工具
                        2. 设置闹钟时，请确保时间格式正确
                        3. 计算时间差时，请提供准确的结果
                        """)
                .defaultTools(dateTimeTools)
                .build();
    }

    /**
     * 原有的航空客服工具接口
     */
    @RequestMapping("/tool")
    public String tool(@RequestParam(value = "message",defaultValue = "讲个笑话")
                           String message) {
        return chatClient.prompt()
                .user(message)
                .call().content();
    }

    /**
     * 日期时间工具调用接口
     */
    @RequestMapping("/datetime")
    public String dateTimeTool(@RequestParam(value = "message", defaultValue = "现在几点了？")
                                   String message) {
        return dateTimeChatClient.prompt()
                .user(message)
                .call().content();
    }

    /**
     * 运行完整的工具调用演示
     */
    @RequestMapping("/demo")
    public String runDemo() {
        try {
            // 这里可以注入ChatModel来运行演示
            return "演示功能已准备就绪，请查看控制台输出。\n" +
                   "可用的演示接口：\n" +
                   "1. /datetime?message=现在几点了？\n" +
                   "2. /datetime?message=帮我设置10分钟后的闹钟\n" +
                   "3. /datetime?message=纽约现在几点？\n" +
                   "4. /tool?message=帮我退票，票号123456，姓名张三";
        } catch (Exception e) {
            return "演示运行失败: " + e.getMessage();
        }
    }

    /**
     * 获取当前时间
     */
    @RequestMapping("/time")
    public String getCurrentTime() {
        return dateTimeChatClient.prompt()
                .user("现在几点了？")
                .call().content();
    }

    /**
     * 设置闹钟
     */
    @RequestMapping("/alarm")
    public String setAlarm(@RequestParam(value = "minutes", defaultValue = "10") int minutes) {
        return dateTimeChatClient.prompt()
                .user("帮我设置" + minutes + "分钟后的闹钟")
                .call().content();
    }
}
